package it.azienda.managerworkstandard.view;

import it.azienda.framework.persistenza.DAOConnectionSingleton;
import it.azienda.framework.persistenza.DAOException;
import it.azienda.framework.utilita.Utilita;
import it.azienda.framework.view.Dettaglio;
import it.azienda.managerworkstandard.modello.BeanFattura;
import it.azienda.managerworkstandard.modello.BeanFatturaAcquisto;
import it.azienda.managerworkstandard.modello.BeanFatturaAcquistoDett;
import it.azienda.managerworkstandard.modello.BeanLogin;
import it.azienda.managerworkstandard.modello.BeanPrimaNota;
import it.azienda.managerworkstandard.modello.BeanPrimaNotaDb;
import it.azienda.managerworkstandard.modello.BeanScontrino;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.GregorianCalendar;
import javax.faces.component.UIViewRoot;
import javax.faces.component.html.HtmlForm;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.hibernate.Query;
import org.hibernate.Session;

public class DettaglioPrimaNota extends Dettaglio{
    
    public DettaglioPrimaNota() {  }
    
    private java.sql.Date dataDa;
    private java.sql.Date dataA;
    private ArrayList listaPrimaNota = new ArrayList();
    
    private HtmlForm form = new HtmlForm();
    private BeanPrimaNota beanPrimaNota = new BeanPrimaNota();
    
    private Double parzialiEntCasse= new Double(0);
    private Double parzialiUscCasse= new Double(0);
    private Double parzialiEntBanca= new Double(0);
    private Double parzialiUscBanca= new Double(0);
    private Double parzialiEntVarie= new Double(0);
    private Double parzialiUscVarie= new Double(0);
    
    public void setBeanPrimaNota(BeanPrimaNota beanPrimaNota) {
        setObj(beanPrimaNota);
        this.beanPrimaNota = beanPrimaNota;
    }
    
    public BeanPrimaNota getBeanPrimaNota(){
        return (BeanPrimaNota)getObj();
    }
    
    public HtmlForm getForm() {
        form = (HtmlForm) Utilita.getSession().getAttribute("form");
        if (form == null) {
            form = new HtmlForm();
        }
        FacesContext ctx = FacesContext.getCurrentInstance();
        beanPrimaNota =(BeanPrimaNota) ctx.getExternalContext().getRequestMap().get("beanPrimaNota");
        Utilita.getSession().removeAttribute("form");
        return form;
    }
    
    public void setForm(HtmlForm form) {
        setFormObject(form);
        this.form = form;
        Utilita.getSession().setAttribute("form",form);
    }
    
    public void entra(ActionEvent ae) {
        pulisci();
        BeanLogin login = (BeanLogin) Utilita.getSession().getAttribute("login");
        this.dataDa = java.sql.Date.valueOf(login.getAnnoGestione().toString()+"-01-01");
        this.dataA = java.sql.Date.valueOf(login.getAnnoGestione().toString()+"-12-31");
        
        String[] splitDataDa = dataDa.toString().split("-");
        String[] splitDataA = dataA.toString().split("-");
        try{
            caricaPrimaNotaManuale();
            caricaPrimaNotaFatt();
            caricaPrimaNotaAcq();
            caricaPrimaNotaScon();
            BeanPrimaNota parzialiPrimaNota = new BeanPrimaNota();
            parzialiPrimaNota.setDescrizione("Parziali dal "+splitDataDa[2].toString()+"/"+splitDataDa[1].toString()+"/"+splitDataDa[0].toString()+
                    " al "+splitDataA[2].toString()+"/"+splitDataA[1].toString()+"/"+splitDataA[0].toString());
            parzialiPrimaNota.setEntCasse(parzialiEntCasse);
            parzialiPrimaNota.setEntBanca(parzialiEntBanca);
            parzialiPrimaNota.setEntVarie(parzialiEntVarie);
            parzialiPrimaNota.setUscCasse(parzialiUscCasse);
            parzialiPrimaNota.setUscBanca(parzialiUscBanca);
            parzialiPrimaNota.setUscVarie(parzialiUscVarie);
            parzialiPrimaNota.setDataA(this.dataA);
            parzialiPrimaNota.setDataDa(this.dataDa);
            parzialiPrimaNota.setDataOperazione(this.dataA);
            parzialiPrimaNota.setTipo("T");
            listaPrimaNota.add(parzialiPrimaNota);
            
            //Ordinamento lista
            Comparator customCompare = new Comparator(){
                public int compare(Object obj1,Object obj2){
                    BeanPrimaNota p1 = (BeanPrimaNota)obj1;
                    BeanPrimaNota p2 = (BeanPrimaNota)obj2;
                    
                    return p1.getDataOperazione().compareTo(p2.getDataOperazione());
                }
            };
            
            java.util.Collections.sort(listaPrimaNota, customCompare);
            
            beanPrimaNota.setListaPrimaNota(listaPrimaNota);
            beanPrimaNota.setDataA(this.dataA);
            beanPrimaNota.setDataDa(this.dataDa);
            Utilita.getRequest().setAttribute("beanPrimaNota",beanPrimaNota);
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("Errore"+e);
        }finally{
            DAOConnectionSingleton.closeSession();
        }
        String url2 = "/dettaglioPrimaNota.jsf";
        FacesContext ctx = FacesContext.getCurrentInstance();
        UIViewRoot view = ctx.getApplication().getViewHandler().createView(ctx,url2);
        view.setViewId(url2);
        ctx.setViewRoot(view);
        ctx.renderResponse();
    }
    
    public void calcolaNuovoPeriodoPrimaNota(){
        Utilita.getRequest().removeAttribute("form");
        beanPrimaNota=(BeanPrimaNota)Utilita.getRequest().getAttribute("beanPrimaNota");
        
        dataDa = new java.sql.Date( beanPrimaNota.getDataDa().getTime());
        dataA = new java.sql.Date( beanPrimaNota.getDataA().getTime());
        
        String[] splitDataDa = dataDa.toString().split("-");
        String[] splitDataA = dataA.toString().split("-");
        
        try{
            caricaPrimaNotaManuale();
            caricaPrimaNotaFatt();
            caricaPrimaNotaAcq();
            caricaPrimaNotaScon();
            
            BeanPrimaNota parzialiPrimaNota = new BeanPrimaNota();
            parzialiPrimaNota.setDescrizione("Parziali dal "+splitDataDa[2].toString()+"/"+splitDataDa[1].toString()+"/"+splitDataDa[0].toString()+
                    " al "+splitDataA[2].toString()+"/"+splitDataA[1].toString()+"/"+splitDataA[0].toString());
            parzialiPrimaNota.setEntCasse(parzialiEntCasse);
            parzialiPrimaNota.setEntBanca(parzialiEntBanca);
            parzialiPrimaNota.setEntVarie(parzialiEntVarie);
            parzialiPrimaNota.setUscCasse(parzialiUscCasse);
            parzialiPrimaNota.setUscBanca(parzialiUscBanca);
            parzialiPrimaNota.setUscVarie(parzialiUscVarie);
            parzialiPrimaNota.setDataOperazione(this.dataA);
            parzialiPrimaNota.setTipo("T");
            listaPrimaNota.add(parzialiPrimaNota);
            
           //Ordinamento lista
            Comparator customCompare = new Comparator(){
                public int compare(Object obj1,Object obj2){
                    BeanPrimaNota p1 = (BeanPrimaNota)obj1;
                    BeanPrimaNota p2 = (BeanPrimaNota)obj2;
                    
                    return p1.getDataOperazione().compareTo(p2.getDataOperazione());
                }
            };
            
            java.util.Collections.sort(listaPrimaNota, customCompare);
            
            beanPrimaNota.setListaPrimaNota(listaPrimaNota);
            
            Utilita.getRequest().setAttribute("beanPrimaNota",beanPrimaNota);
            
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("Errore"+e);
        }finally{
            DAOConnectionSingleton.closeSession();
        }
        String url2 = "/dettaglioPrimaNota.jsf";
        FacesContext ctx = FacesContext.getCurrentInstance();
        UIViewRoot view = ctx.getApplication().getViewHandler().createView(ctx,url2);
        view.setViewId(url2);
        ctx.setViewRoot(view);
        ctx.renderResponse();
    }
    
    public void caricaPrimaNotaFatt() throws DAOException{
        String query="select beanFattura from BeanFattura beanFattura" +
                " where beanFattura.data between :dataDa and :dataA";
        
        Session session = session = DAOConnectionSingleton.newSession();
        Query q = null;
        DAOConnectionSingleton.beginTransaction();
        q = session.createQuery(query).setDate("dataDa",dataDa).setDate("dataA",dataA);
        ArrayList lista=(ArrayList)q.list();
        DAOConnectionSingleton.commitTransaction();
        
        for(int i=0;i<lista.size();i++){
            BeanFattura beanFattura=(BeanFattura)lista.get(i);
            //RATA 1
            if(beanFattura.getData1()!=null && beanFattura.getImporto1()!=null){
                if(beanFattura.getPagato1().equals("S")){
                    BeanPrimaNota primaNota = new BeanPrimaNota();
                    primaNota.setDataOperazione(beanFattura.getData());
                    primaNota.setTipo("F");
                    String descrizione = "";
                    
                    if(beanFattura.getBeanCliente() != null){
                        descrizione +="Cliente: " +beanFattura.getBeanCliente().getRagioneSociale() +" - ";
                    }
                    descrizione += "Fattura n. "+beanFattura.getCodice();
                    String[] splitData = beanFattura.getData1().toString().split("-");
                    descrizione +=", Rata Pagata n.1, il "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString();
                    if(beanFattura.getBeanTipoPagamento() != null){
                        descrizione +=" - Tipo pagam. "+ beanFattura.getBeanTipoPagamento().getDescrizione()+" - ";
                    }
                    primaNota.setDescrizione(descrizione);
                    if(beanFattura.getPagatoBanca().equals("S")){
                        primaNota.setEntBanca(beanFattura.getImporto1());
                        parzialiEntBanca = arrotonda(new Double(parzialiEntBanca.doubleValue() + beanFattura.getImporto1().doubleValue()),2);
                    }else{
                        primaNota.setEntCasse(beanFattura.getImporto1());
                        parzialiEntCasse = arrotonda(new Double(parzialiEntCasse.doubleValue() + beanFattura.getImporto1().doubleValue()),2);
                    }
                    listaPrimaNota.add(primaNota);
                }
            }
            //RATA 2
            if(beanFattura.getData3()!=null && beanFattura.getImporto2()!=null){
                if(beanFattura.getPagato2().equals("S")){
                    BeanPrimaNota primaNota = new BeanPrimaNota();
                    primaNota.setDataOperazione(beanFattura.getData2());
                    primaNota.setTipo("F");
                    String descrizione = "";
                    
                    if(beanFattura.getBeanCliente() != null){
                        descrizione +="Cliente: " +beanFattura.getBeanCliente().getRagioneSociale() +" - ";
                    }
                    descrizione += "Fattura n. "+beanFattura.getCodice();
                    String[] splitData = beanFattura.getData2().toString().split("-");
                    descrizione +=", Rata Pagata n.2, il "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString();
                    if(beanFattura.getBeanTipoPagamento() != null){
                        descrizione +=" - Tipo pagam. "+ beanFattura.getBeanTipoPagamento().getDescrizione()+" - ";
                    }
                    primaNota.setDescrizione(descrizione);
                    if(beanFattura.getPagatoBanca().equals("S")){
                        primaNota.setEntBanca(beanFattura.getImporto2());
                        parzialiEntBanca = arrotonda(new Double(parzialiEntBanca.doubleValue() + beanFattura.getImporto2().doubleValue()),2);
                    }else{
                        primaNota.setEntCasse(beanFattura.getImporto2());
                        parzialiEntCasse = arrotonda(new Double(parzialiEntCasse.doubleValue() + beanFattura.getImporto2().doubleValue()),2);
                    }
                    listaPrimaNota.add(primaNota);
                }
            }
            //RATA 3
            if(beanFattura.getData3()!=null && beanFattura.getImporto3()!=null){
                if(beanFattura.getPagato3().equals("S")){
                    BeanPrimaNota primaNota = new BeanPrimaNota();
                    primaNota.setDataOperazione(beanFattura.getData3());
                    primaNota.setTipo("F");
                    String descrizione = "";
                    
                    if(beanFattura.getBeanCliente() != null){
                        descrizione +="Cliente: " +beanFattura.getBeanCliente().getRagioneSociale() +" - ";
                    }
                    descrizione += "Fattura n. "+beanFattura.getCodice();
                    String[] splitData = beanFattura.getData3().toString().split("-");
                    descrizione +=", Rata Pagata n.3, il "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString();
                    if(beanFattura.getBeanTipoPagamento() != null){
                        descrizione +=" - Tipo pagam. "+ beanFattura.getBeanTipoPagamento().getDescrizione()+" - ";
                    }
                    primaNota.setDescrizione(descrizione);
                    if(beanFattura.getPagatoBanca().equals("S")){
                        primaNota.setEntBanca(beanFattura.getImporto3());
                        parzialiEntBanca = arrotonda(new Double(parzialiEntBanca.doubleValue() + beanFattura.getImporto3().doubleValue()),2);
                    }else{
                        primaNota.setEntCasse(beanFattura.getImporto3());
                        parzialiEntCasse = arrotonda(new Double(parzialiEntCasse.doubleValue() + beanFattura.getImporto3().doubleValue()),2);
                    }
                    listaPrimaNota.add(primaNota);
                }
            }
            //RATA 4
            if(beanFattura.getData4()!=null && beanFattura.getImporto4()!=null){
                if(beanFattura.getPagato4().equals("S")){
                    BeanPrimaNota primaNota = new BeanPrimaNota();
                    primaNota.setDataOperazione(beanFattura.getData4());
                    primaNota.setTipo("F");
                    String descrizione = "";
                    
                    if(beanFattura.getBeanCliente() != null){
                        descrizione +="Cliente: " +beanFattura.getBeanCliente().getRagioneSociale() +" - ";
                    }
                    descrizione += "Fattura n. "+beanFattura.getCodice();
                    String[] splitData = beanFattura.getData4().toString().split("-");
                    descrizione +=", Rata Pagatan.4, il "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString();
                    if(beanFattura.getBeanTipoPagamento() != null){
                        descrizione +=" - Tipo pagam. "+ beanFattura.getBeanTipoPagamento().getDescrizione()+" - ";
                    }
                    primaNota.setDescrizione(descrizione);
                    if(beanFattura.getPagatoBanca().equals("S")){
                        primaNota.setEntBanca(beanFattura.getImporto4());
                        parzialiEntBanca = arrotonda(new Double(parzialiEntBanca.doubleValue() + beanFattura.getImporto4().doubleValue()),2);
                    }else{
                        primaNota.setEntCasse(beanFattura.getImporto4());
                        parzialiEntCasse = arrotonda(new Double(parzialiEntCasse.doubleValue() + beanFattura.getImporto4().doubleValue()),2);
                    }
                    listaPrimaNota.add(primaNota);
                }
            }
        }
    }
    
    public void caricaPrimaNotaManuale() throws DAOException{
        String query="select beanPrimaNotaDb from BeanPrimaNotaDb beanPrimaNotaDb" +
                " where beanPrimaNotaDb.data between :dataDa and :dataA" +
                " and beanPrimaNotaDb.stampa = 'S'";
        
        Session session = session = DAOConnectionSingleton.newSession();
        ArrayList lista=(ArrayList)session.createQuery(query).setDate("dataDa",dataDa).setDate("dataA",dataA).list();
        
        for(int i=0;i<lista.size();i++){
            BeanPrimaNotaDb beanPrimaNotaDb=(BeanPrimaNotaDb)lista.get(i);
            
            BeanPrimaNota primaNota = new BeanPrimaNota();
            primaNota.setDataOperazione(beanPrimaNotaDb.getData());
            primaNota.setTipo("M");
            primaNota.setDescrizione(beanPrimaNotaDb.getDescrizione());
            
            if(beanPrimaNotaDb.getEntCassa() != null){
                primaNota.setEntCasse(beanPrimaNotaDb.getEntCassa());
                parzialiEntCasse = arrotonda(new Double(parzialiEntCasse.doubleValue() + beanPrimaNotaDb.getEntCassa().doubleValue()),2);
            } if(beanPrimaNotaDb.getUscCassa() != null){
                primaNota.setUscCasse(beanPrimaNotaDb.getUscCassa());
                parzialiUscCasse = arrotonda(new Double(parzialiUscCasse.doubleValue() + beanPrimaNotaDb.getUscCassa().doubleValue()),2);
            } if(beanPrimaNotaDb.getEntBanca() != null){
                primaNota.setEntBanca(beanPrimaNotaDb.getEntBanca());
                parzialiEntBanca = arrotonda(new Double(parzialiEntBanca.doubleValue() + beanPrimaNotaDb.getEntBanca().doubleValue()),2);
            } if(beanPrimaNotaDb.getUscBanca() != null){
                primaNota.setUscBanca(beanPrimaNotaDb.getUscBanca());
                parzialiUscBanca = arrotonda(new Double(parzialiUscBanca.doubleValue() + beanPrimaNotaDb.getUscBanca().doubleValue()),2);
            } if(beanPrimaNotaDb.getEntVarie() != null){
                primaNota.setEntVarie(beanPrimaNotaDb.getEntVarie());
                parzialiEntVarie = arrotonda(new Double(parzialiEntVarie.doubleValue() + beanPrimaNotaDb.getEntVarie().doubleValue()),2);
            } if(beanPrimaNotaDb.getUscVarie() != null){
                primaNota.setUscVarie(beanPrimaNotaDb.getUscVarie());
                parzialiUscVarie = arrotonda(new Double(parzialiUscVarie.doubleValue() + beanPrimaNotaDb.getUscVarie().doubleValue()),2);
            }
            
            
            
            listaPrimaNota.add(primaNota);
        }
        return;
    }
    
    
    public void caricaPrimaNotaAcq() throws DAOException{
        String query="select beanFatturaAcquistoDett from  BeanFatturaAcquisto beanFatturaAcquisto," +
                " BeanFatturaAcquistoDett  beanFatturaAcquistoDett" +
                " where beanFatturaAcquisto.data between :dataDa and :dataA" +
                " and beanFatturaAcquisto.id = beanFatturaAcquistoDett.beanFatturaAcquisto.id";
        
        Session session = session = DAOConnectionSingleton.newSession();
        Query q = null;
        DAOConnectionSingleton.beginTransaction();
        q = session.createQuery(query).setDate("dataDa",dataDa).setDate("dataA",dataA);
        ArrayList lista=(ArrayList)q.list();
        DAOConnectionSingleton.commitTransaction();
        
        for(int i=0;i<lista.size();i++){
            BeanFatturaAcquistoDett beanFatturaAcquistoDett=(BeanFatturaAcquistoDett)lista.get(i);
            if(beanFatturaAcquistoDett.getImportoRata() != null){
                if(beanFatturaAcquistoDett.getPagato().equals("S")){
                    BeanPrimaNota primaNota = new BeanPrimaNota();
                    primaNota.setDataOperazione(beanFatturaAcquistoDett.getBeanFatturaAcquisto().getData());
                    primaNota.setTipo("A");
                    String descrizione = "";
                    if(beanFatturaAcquistoDett.getBeanFatturaAcquisto().getBeanFornitore() != null){
                        descrizione += "Fornitore: "+beanFatturaAcquistoDett.getBeanFatturaAcquisto().getBeanFornitore().getRagioneSociale()+" - ";
                    }
                    descrizione += "Fattura n. "+beanFatturaAcquistoDett.getBeanFatturaAcquisto().getNumeroFattura();
                    descrizione += ", Pagata Rata n."+beanFatturaAcquistoDett.getNumRata()+"/"+beanFatturaAcquistoDett.getBeanFatturaAcquisto().getNumeroRate();
                    String[] splitData = beanFatturaAcquistoDett.getScadenza().toString().split("-");
                    descrizione +=", il "+splitData[2].toString()+"/"+splitData[1].toString()+"/"+splitData[0].toString()+" ";
                    if(beanFatturaAcquistoDett.getBeanFatturaAcquisto().getBeanTipoPagamento() != null){
                        descrizione += "Tipo pagam. "+beanFatturaAcquistoDett.getBeanFatturaAcquisto().getBeanTipoPagamento().getDescrizione()+" ";
                    }
                    
                    if(beanFatturaAcquistoDett.getPagatoBanca().equals("N")){
                        primaNota.setUscCasse(beanFatturaAcquistoDett.getImportoRata());
                        parzialiUscCasse = arrotonda(new Double(parzialiUscCasse.doubleValue() + beanFatturaAcquistoDett.getImportoRata().doubleValue()),2);
                    }else{
                        primaNota.setUscBanca(beanFatturaAcquistoDett.getImportoRata());
                        parzialiUscBanca = arrotonda(new Double(parzialiUscBanca.doubleValue() + beanFatturaAcquistoDett.getImportoRata().doubleValue()),2);
                        if(beanFatturaAcquistoDett.getNumeroAssegno()!=null){
                            if(beanFatturaAcquistoDett.getNumeroAssegno().length()>1){
                                descrizione+="Pagata con Assegno num. "+beanFatturaAcquistoDett.getNumeroAssegno();
                            }
                        }
                    }
                    primaNota.setDescrizione(descrizione);
                    listaPrimaNota.add(primaNota);
                }
            }
        }
    }
    
    public void caricaPrimaNotaScon()throws DAOException{
        String query="select beanScontrino from BeanScontrino beanScontrino" +
                " where beanScontrino.data between :dataDa and :dataA";
        
        Session session = session = DAOConnectionSingleton.newSession();
        Query q = null;
        DAOConnectionSingleton.beginTransaction();
        q = session.createQuery(query).setDate("dataDa",dataDa).setDate("dataA",dataA);
        ArrayList lista=(ArrayList)q.list();
        DAOConnectionSingleton.commitTransaction();
        
        for(int i=0;i<lista.size();i++){
            BeanScontrino beanScontrino=(BeanScontrino)lista.get(i);
            BeanPrimaNota primaNota = new BeanPrimaNota();
            primaNota.setDataOperazione(beanScontrino.getData());
            primaNota.setTipo("S");
            String descrizione = "Numero: "+beanScontrino.getNumero().toString();
            
            primaNota.setDescrizione(descrizione);
            primaNota.setEntCasse(beanScontrino.getTotale());
            parzialiEntCasse = arrotonda(new Double(parzialiEntCasse.doubleValue() + beanScontrino.getTotale().doubleValue()),2);
            listaPrimaNota.add(primaNota);
        }
    }
    
    public Double arrotonda(Object obj,int precisione){
        Double valore=(Double)obj;
        Double valoreArr=new Double(0);
        double pot = Math.pow(10, precisione);
        double  v = valore.doubleValue() * pot;
        valoreArr = new Double(Math.round(v) / pot);
        return valoreArr;
    }
    
    public String calcolaMese(int mese){
        String meseSt="";
        switch(mese){
            case 1: meseSt="GENNAIO"; break;
            case 2: meseSt="FEBBRAIO"; break;
            case 3: meseSt="MARZO"; break;
            case 4: meseSt="APRILE"; break;
            case 5: meseSt="MAGGIO"; break;
            case 6: meseSt="GIUGNO"; break;
            case 7: meseSt="LUGLIO"; break;
            case 8: meseSt="AGOSTO"; break;
            case 9: meseSt="SETTEMBRE"; break;
            case 10: meseSt="OTTOBRE"; break;
            case 11: meseSt="NOVEMBRE"; break;
            case 12: meseSt="DICEMBRE"; break;
            default: meseSt="";
            break;
        }
        return meseSt;
    }
    
    public void pulisci(){
        HttpSession sessione = (HttpSession)Utilita.getSession();
        HttpServletRequest richiesta =(HttpServletRequest)Utilita.getRequest();
        
        sessione.removeAttribute("form");
        sessione.removeAttribute("posizioneOggetto");
        sessione.removeAttribute("beanFind");
    }
}
